package com.cskaoyan.java.object._2tostring;

/**
 * Object类当中toString()方法的声明为：
 * public String toString()
 * 没有什么特别需要注意的地方，记住它有返回值，并且返回字符串String就可以了。
 *
 * 该方法的作用:
 * 关于toString()方法的作用，在官方JDK文档中，有详细的说明，主要是以下四点：
 *      1.返回该对象（调用toString方法的对象）的字符串表示。
 *      2.通常，toString()方法会返回一个"以文本方式表示"此对象的字符串。
 *      3.结果应是一个简明但易于读懂的信息表达式。
 *      4.建议所有子类都重写此方法。
 *
 * Object类当中toString方法默认实现:
 *  return this.getClass().getName() + "@" + Integer.toHexString(this.hashCode());
 * 解释:
 *      Object类当中的hashCode()方法默认实现,是将一个对象的内存地址计算成一个十进制整数,并返回这个十进制整数'
 *          这个十进制整数,可以认为是对象的地址值
 *      该方法返回
 *      某个类型的全限定类名 + "@" + 十六进制地址值字符串
 *
 * (重点) 实际上,在Java代码中直接输出一个引用,实际上是输出该引用隐式调用toString方法的结果
 *      以及所有引用参与的字符串拼接运算,也会隐式调用toString方法
 *
 * 一般来说,打印对象,更希望看到对象的状态(属性信息),所以建议子类重写该方法
 * 重写方法的规则,一般都是选择输出对象的属性信息
 *
 * 注意事项:
 *      1.toString方法重写的规则普遍都是打印属性信息,格式是非常固定的,建议快捷键alt+insert自动生成
 *      不要手写,没有必要
 *
 *      2.(细节问题)toString()方法，普遍来说就是为了完成打印成员变量取值的，不要在里面写一些奇怪的代码。
 *      比如，业务代码，赋值代码等等。
 *      IDEA的debug模式下,当代码执行完创建对象,调用方法等语句时,会自动调用toString方法
 *      在代码行的后面打印该类的属性信息
 *
 *      3.打印引用或者引用参数字符串拼接时,会隐式的自动调用toString方法
 *      那么直接写出这个方法调用可以吗?
 *      不要这么做,画蛇添足,只有害处没有好处
 *
 * @since 11:29
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        Student s = new Student(18, "张三");
        System.out.println(s.getAge());
        System.out.println(s.toString());
        System.out.println(s + "hello");

        Student s2 = null;
        System.out.println(s2);
        // System.out.println(s2.toString());
    }
}

class Student {
    private int age;
    private String name;

    public Student(int age, String name) {
        this.age = age;
        this.name = name;
    }

    /*@Override
    public String toString() {
        return "Student{age = " + age + ",name = " + name + "}";
    }*/

    @Override
    public String toString() {
        // age = 28;
        return "Student{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }

    public int getAge() {
        return age;
    }
}